/**
 *
 * Copyright (C), 2002-2017, è½¦å›½ç½‘.
 */
package main;

import java.util.List;

import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.api.dom.java.JavaVisibility;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.api.dom.xml.Attribute;
import org.mybatis.generator.api.dom.xml.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement;

/**
 *
 * @author zhangweifeng
 * @version $Id: PagePlugin.java, v 0.1 2017年12月8日 上午10:50:09 zhangweifeng Exp $
 */
public class PagePlugin extends PluginAdapter {

	@Override
	public boolean validate(List<String> list) {
		return true;
	}

	/**
	 * 为每个Example类添加limit和offset属性已经set、get方法
	 */
	@Override
	public boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {

		// PrimitiveTypeWrapper integerWrapper =
		// FullyQualifiedJavaType.getIntInstance().getPrimitiveTypeWrapper();
		FullyQualifiedJavaType superClass = new FullyQualifiedJavaType("main.Page");
		topLevelClass.setSuperClass(superClass);

		Field serialVersionUID = new Field();
		serialVersionUID.setStatic(true);
		serialVersionUID.setFinal(true);
		serialVersionUID.setVisibility(JavaVisibility.PRIVATE);
		serialVersionUID.setName("serialVersionUID");
		serialVersionUID.setInitializationString("1L");
		FullyQualifiedJavaType longType = new FullyQualifiedJavaType("long");
		serialVersionUID.setType(longType);
		topLevelClass.addField(serialVersionUID);

		// Field limit = new Field();
		// limit.setName("limit");
		// limit.setVisibility(JavaVisibility.PRIVATE);
		// limit.setType(integerWrapper);
		// topLevelClass.addField(limit);
		//
		// Method setLimit = new Method();
		// setLimit.setVisibility(JavaVisibility.PUBLIC);
		// setLimit.setName("setLimit");
		// setLimit.addParameter(new Parameter(integerWrapper, "limit"));
		// setLimit.addBodyLine("this.limit = limit;");
		// topLevelClass.addMethod(setLimit);
		//
		// Method getLimit = new Method();
		// getLimit.setVisibility(JavaVisibility.PUBLIC);
		// getLimit.setReturnType(integerWrapper);
		// getLimit.setName("getLimit");
		// getLimit.addBodyLine("return limit;");
		// topLevelClass.addMethod(getLimit);
		//
		// Field offset = new Field();
		// offset.setName("offset");
		// offset.setVisibility(JavaVisibility.PRIVATE);
		// offset.setType(integerWrapper);
		// topLevelClass.addField(offset);
		//
		// Method setOffset = new Method();
		// setOffset.setVisibility(JavaVisibility.PUBLIC);
		// setOffset.setName("setOffset");
		// setOffset.addParameter(new Parameter(integerWrapper, "offset"));
		// setOffset.addBodyLine("this.offset = offset;");
		// topLevelClass.addMethod(setOffset);
		//
		// Method getOffset = new Method();
		// getOffset.setVisibility(JavaVisibility.PUBLIC);
		// getOffset.setReturnType(integerWrapper);
		// getOffset.setName("getOffset");
		// getOffset.addBodyLine("return offset;");
		// topLevelClass.addMethod(getOffset);

		return true;
	}

	/**
	 * 为Mapper.xml的selectByExample添加limit
	 */
	@Override
	public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element,
			IntrospectedTable introspectedTable) {

		XmlElement ifLimitNotNullElement = new XmlElement("if");
		ifLimitNotNullElement.addAttribute(new Attribute("test", "limit != null"));

		XmlElement ifOffsetNotNullElement = new XmlElement("if");
		ifOffsetNotNullElement.addAttribute(new Attribute("test", "offset != null"));
		ifOffsetNotNullElement.addElement(new TextElement("limit ${offset}, ${limit}"));
		ifLimitNotNullElement.addElement(ifOffsetNotNullElement);

		XmlElement ifOffsetNullElement = new XmlElement("if");
		ifOffsetNullElement.addAttribute(new Attribute("test", "offset == null"));
		ifOffsetNullElement.addElement(new TextElement("limit ${limit}"));
		ifLimitNotNullElement.addElement(ifOffsetNullElement);

		element.addElement(ifLimitNotNullElement);

		return true;
	}

}
